#include<stdio.h>
 #include<stdlib.h>  //堆管理

// 栈      大小，几M
// 文字常量区
// 代码段
// 静态全局区 ： 静态变量和全局变量
// 堆：申请和销毁都是由用户决定，大小起步1个G

// void func()
// {
//     static int a = 10;
// }


// int * func()
// {
//     static int a[10] = {0}; 
//     return a;
// }

int main()
{
    //malloc : 申请一块堆上空间
    //malloc : 申请空间可能失败，失败返回NULL
    //malloc(4); //申请4个字节的空间
    //malloc(sizeof(int)); //申请4个字节的空间
    // int *a = (int *)malloc(sizeof(int));
    // if(a == NULL)
    // {
    //     printf("空间申请失败!\n");
    //     return -1;
    // }
    // *a = 10;
    // printf("%d\n",*a);

    //内存泄漏：堆上空间只申请不释放
    // free(a); // 释放内存

    int *a = (int*)malloc(sizeof(int) * 10);
    if(a == NULL)
    {
        printf("空间申请失败!\n");
        return -1;
    }
    for(int i = 0;i < 10; i++)
    {
        a[i] = i+1;
    }
    for(int i = 0;i < 10; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    // free(a);

//     int **a = (int **)malloc(sizeof(int *) * 2); //申请一个二维数组 2行3列
//     if(a == NULL)
//     {
//         printf("空间申请失败!\n");
//         return -1;
//     }
//     for(int i = 0;i < 2;i++)
//     {
//         a[i] = (int*)malloc(sizeof(int) * 3 );
//     }


//     for(int i=0;i<2;i++)
//     {
//         for(int j=0;j<3;j++)
//         {
//             a[i][j] = i*2+j;
//             printf("%d ",a[i][j]);
//         }
//         printf("\n");
//     }

//     for(int i=0;i<2;i++)
//     {
//         free(a[i]);
//     }
    // free(a);


    //malloc ： 一次性申请40个字节，不知道你怎么处理，所以不能初始化
    //calloc  : 申请10个4个字节的内存，所以可以初始化。

    //会将申请的每一块内存初始化为0    适合申请数组
    //calloc();

    // int *a = (int *)calloc(10,sizeof(int));
    // if(a == NULL)
    // {
    //     printf("calloc申请空间失败!\n");
    //     return -1;
    // }
    // for(int i = 0;i < 10; i++)
    // {
    //     printf("%d ",a[i]);
    // }
    // printf("\n");







    //扩容函数：将原本指向的堆上空间进行扩容

    //1、原地扩容：原指针仍然可以使用
    //2、重新申请空间：原指针的内存会被释放，原指针失效

    //无论是哪种方式，都默认使用新的指针
    int *p = realloc(a,sizeof(int) * 20);
    for(int i = 0;i < 10; i++)
    {
        printf("%d ",p[i]);
    }
    printf("\n");
    free(p);
    return 0;
}